#include "cwds.h"
#include <QFile>
#include <QTextStream>

QString SetLine(char* sPrm) {
    QByteArray text1251(sPrm);
    QTextCodec* codec1251 = QTextCodec::codecForName("Windows-1251");
    return codec1251->toUnicode(text1251);
}

CWds::CWds()
{
    Array = nullptr;
    ArrayRat = nullptr;
    ArrayMat = nullptr;
    ArrayAat = nullptr;

    whs.clear();
    but.clear();
    ogl.clear();
    RunStr.clear();
}
CWds::~CWds()
{
    whs.clear();
    but.clear();
    ogl.clear();

    RunStr.clear();
    if(Array != nullptr) delete []Array; // Область Whs
    if(ArrayRat != nullptr) delete []ArrayRat;
    if(ArrayMat != nullptr) delete []ArrayMat;
    if(ArrayAat != nullptr) delete []ArrayAat;
}
int CWds::checkWhs(QPoint p)
{
    short res = -1;
    for(int i = 0; i < whs.size(); i++)  {
        if(!Select(whs.at(i)->x, whs.at(i)->y,whs.at(i)->cx + whs.at(i)->x, whs.at(i)->cy + whs.at(i)->y, p.x(), p.y())) res = i;
    }
    return res;
}

bool CWds::loadWds(QString FileName)
{
    whs.clear();
    QFile file(FileName);
    if(!file.open(QIODevice::ReadOnly)) return false;
    if(file.read((char*)&header, sizeof(DESKTOPHEADER)) < 1) return false;
    file.read((char*)&gensh, sizeof(DESK_GENSH2)); // iVersion > 5

    if(file.read((char*)&wCounter, 2) < 1) return false;  // Количество элементов
    if(file.read((char*)&wSizesh, 2) < 1) return false; // Размер элемента внешний
    if(file.read((char*)&wIncrease, 2) < 1) return false; // Размер приращения при вставке

    if(Array != nullptr) delete []Array;
    int lsize =  (int)wCounter * (int)wSizesh;
    Array = new char[lsize];
    file.read(Array, lsize);

    if(file.read((char*)&Rte, 4) < 1) Rte = 0; // Нет никакого объекта RTE
    else {
        file.read((char*)&hRte, sizeof(RTEHEADER));
        char qc[RUNNERSIZE];

        for(int i = 0; i < hRte.iRunner; i++) {
            file.read(qc, RUNNERSIZE); // Длина идентификатора RUNNERSIZE 24
            RunStr << SetLine(qc);
        }
        if(hRte.iRAT != 0) { // Таблица реакций
            if(ArrayRat != nullptr) delete []ArrayRat;
            lsize =  (int)hRte.iRAT * (int)sizeof(RAT);
            ArrayRat = new char[lsize];
            file.read(ArrayRat, lsize);
        }
        if(hRte.iMAT != 0) { // Таблица сообщений
            if(ArrayMat != nullptr) delete []ArrayMat;
            lsize =  (int)hRte.iMAT * (int)sizeof(MAT);
            ArrayMat = new char[lsize];
            file.read(ArrayMat, lsize);
        }
        if(hRte.iAAT != 0) { // Таблица функций
            if(ArrayAat != nullptr) delete []ArrayAat;
            lsize =  (int)hRte.iAAT * (int)sizeof(AAT);
            ArrayAat = new char[lsize];
            file.read(ArrayAat, lsize);
        }
//        if(hRte.dwProgram != 0) { // Есть объектный код
//            if(ArrayProg != nullptr) delete []ArrayProg;
//            ArrayProg = new char[hRte.dwProgram];
//            file.read(ArrayProg, hRte.dwProgram);
//        }
    }

    file.close();

    DESK_ITEMSH2* par = (DESK_ITEMSH2*)Array;
    for(int i = 0; i < wCounter; i++) {
        QString str("/home/peter/d/Distribs/30SM_LS/WHS/");
        CWhs* pwhs = new CWhs;
        pwhs->x = par[i].x;  pwhs->y = par[i].y;
        pwhs->cx = par[i].cx;  pwhs->cy = par[i].cy;
        if(pwhs->x < 0 ) { pwhs->cx += pwhs->x; pwhs->x = 0; }
        if(pwhs->y < 0 ) { pwhs->cy += pwhs->y; pwhs->y = 0; }
        pwhs->iRTEmode = par[i].iRTEmode;
        pwhs->iIdentification = par[i].iIdentification;
        pwhs->iDesktop = par[i].iDesktop;
        pwhs->iView = par[i].iView;
        pwhs->Flags = par[i].Flags;
        pwhs->adFlags = par[i].adFlags;
        str += par[i].szFile;
        if((par[i].hText !=0) || (par[i].hDesktop != 0)) { // Цвет фона окна
            pwhs->fon.setRgb((int)(par[i].hText & 0xFF), (int)((par[i].hText >> 8) & 0xFF), (int)(par[i].hDesktop & 0xFF), (int)((par[i].hDesktop >> 8) & 0xFF));
        }
        else pwhs->fon.setRgb(220,220,220); // Надо Palette.color ((BYTE)par[i].bBackground);
        if(pwhs->loadWhs(str)) {
            pwhs->createWhsObjects();
            whs.append(pwhs);
        }
    }
    return true;
}
#include "mainwindow.h"

void CWds::showButtons(QWidget *parent)
{
    if(ogl.empty()) {
        ogl.append(new CGlWindow(parent));
        ogl.at(0)->fds.Load3ds("/home/peter/d/Distribs/30SM_LS/3DS/RUS1.3DS"); // RUS1 Pedali1 Avr_Shassi
        ogl.at(0)->fds.LoadTextures("/home/peter/d/Distribs/30SM_LS/3DS/PNG/");
        ogl.at(0)->fds.SetBoundBox();
        ogl.at(0)->fds.SetNormal();

        ogl.at(0)->move(10,590);
        ogl.at(0)->resize(480,480);
        ogl.at(0)->show();
    }
    if(but.empty()) {
          but.append(new QPushButton("ВЫХОД", parent)); but.at(0)->setFont(QFont("Times", 14));
          but.at(0)->move(1378, 1088); but.at(0)->resize(129, 32); but.at(0)->show();
          QObject::connect(but.at(0), SIGNAL(clicked()), parent, SLOT(close()));
          but.append(new QPushButton("В НАЧАЛО", parent)); but.at(1)->setFont(QFont("Times", 14));
          but.at(1)->move(1507, 1088); but.at(1)->resize(129, 32); but.at(1)->setEnabled(false);
          but.at(1)->show();
          but.append(new QPushButton("<<", parent)); but.at(2)->setFont(QFont("Arial", 20));
          but.at(2)->move(1636, 1088); but.at(2)->resize(129, 32); but.at(2)->show();
          but.append(new QPushButton(">>", parent)); but.at(3)->setFont(QFont("Arial", 20));
          but.at(3)->move(1765, 1088); but.at(3)->resize(129, 32);/* but.at(3)->setEnabled(false);*/
          but.at(3)->show();
          QObject::connect(but.at(3), SIGNAL(clicked()), parent, SLOT(button_Next())); // Кнопка >>
    }
}
bool CWds::dumpWds()
{
    QString str = gensh.szFile;
    int k = str.lastIndexOf('\\'); str.remove(0, k+1);
    str.replace(str.count() - 3, 3, "log");
    QFile file("/home/peter/d/Distribs/30SM_LS/logWds/" + str);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false;
    QTextStream out(&file);

    out << "DESKTOPHEADER: (size "<< sizeof (DESKTOPHEADER) << ")\n";
    str = "Метка формата файла: "; out << str  <<  header.wLabel[0]  <<  header.wLabel[1] << "\n";
    str = "Версия N: "; out << str << header.iVersion << "\n";

    str = "\nКоличество объектов wCounter = "; out << str << wCounter << "\n";
    str = "Размер элемента внешний  wSizesh = "; out << str << wSizesh << "\n";
    str = "Размер приращения при вставке wIncrease =  "; out << str << wIncrease << "\n";
    int lsize =  (int)wCounter * (int)wSizesh;
    out << "Array: wCounter * wSizesh (size "<< lsize << ")\n";

    out << "\nDESK_GENSH2: (size "<< sizeof (DESK_GENSH2) << ")\n";
    str = "Количество объектов wCounter = "; out << str << gensh.wCounter << "\n";
    str = "Размер элемента в байтах wSize = "; out << str << gensh.wSize << "\n";
    str = "Размер приращения при вставке wIncrease = "; out << str << gensh.wIncrease << "\n";
    str = "Размер массива в байтах dwSize = "; out << str << gensh.dwSize << "\n";
    str = "Дескриптор блока памяти hgArray = "; out << str << gensh.hgArray << "\n";
    str = "Адрес при фиксации блока памяти hpArray = "; out << str << gensh.hpArray << "\n";
    str = "Имя владельца файла (szName[16]): "; out << str; str = gensh.szName; out << str << "\n";
    str = "Количество групп окон iDesktops = "; out << str << gensh.iDesktops << "\n";
    str = "Номер текущей группы iDesktop = "; out << str << gensh.iDesktop << "\n";
    str = "Стартовый режим iRTEmode = "; out << str << gensh.iRTEmode << "\n";
    str = "Идентификатор последнего окна iLastWindow = "; out << str << gensh.iLastWindow << "\n";
    str = "Объект поиска hFinder = "; out << str << gensh.hFinder << "\n";
    str = "Наименование группы окон (szTitle[128]): "; out << str; str = gensh.szTitle; out << str << "\n";
    str = "Полное имя файла WDS (szFile[192]): "; out << str; str = gensh.szFile; out << str << "\n";
    str = "Индекс группы окон iIndex = "; out << str << gensh.iIndex << "\n";
    str = "Резервируемые слова iReserved3 [7] = (";  out << str << gensh.iReserved3[0] << ", ";
    out << gensh.iReserved3[1] << ", " << gensh.iReserved3[2] << ", " << gensh.iReserved3[3] << ", ";
    out << gensh.iReserved3[4] << ", " << gensh.iReserved3[5] << ", " << gensh.iReserved3[6] << ")\n";
    str = "Дескриптор объекта RTE hRTE = "; out << str << gensh.hRTE << "\n";
    str = "Резервируемое слово iReserved4 = "; out << str << gensh.iReserved4 << "\n";
    str = "Поле индикаторов (Flags): 0x"; out << str  << QString::number(gensh.Flags, 16).toUpper() << "\n";
    DESK_ITEMSH2* par = (DESK_ITEMSH2*)Array;
    for(int i = 0; i < wCounter; i++) {
        str = "\nОкно N: "; out << str << QString::number(i+1) << "\n";
        str = "Координаты окна (x,y) "; out << str;
        out << QString::number(par[i].x) << "," << QString::number(par[i].y) << "\n";
        str = "Размер окна (cx,cy) "; out << str;
        out << QString::number(par[i].cx) << "," << QString::number(par[i].cy) << "\n";
        str = "Стартовый режим iRTEmode: "; out << str << QString::number(par[i].iRTEmode) << "\n";
        str = "Код идентификации окна iIdentification: "; out << str << QString::number(par[i].iIdentification) << "\n";
        str = "Код группы окон iDesktop: "; out << str << QString::number(par[i].iDesktop) << "\n";
        str = "Номер вида окна iView: "; out << str << QString::number(par[i].iView) << "\n";
        str = "Имя файла (szFile[36]): "; out << str; str = par[i].szFile; out << str << "\n";
        str = "Поле индикаторов (Flags): 0x"; out << str  << QString::number(par[i].Flags, 16).toUpper() << "\n";
        str = "Цвет фона окна (B, A): "; out << str << QString::number(par[i].hDesktop) << "\n";
        str = "Цвет фона окна (R, G): "; out << str << QString::number(par[i].hText) << "\n";
        str = "Длина строки заголовка iText: "; out << str << QString::number(par[i].iText) << "\n";
        str = "Поле индикаторов (adFlags): 0x"; out << str  << QString::number(par[i].adFlags, 16).toUpper() << "\n";
        str = "Индекс цвета фона окна bBackground: "; out << str << QString::number(par[i].bBackground) << "\n";
        str = "Индекс группы окон bDesktopIndex: "; out << str << QString::number(par[i].bDesktopIndex) << "\n";
    }

    str = "\nРазмер объекта RTE = "; out << str << Rte << "\n";
    if(Rte != 0) {
        str = "Количество объектов iRunner: "; out << str << QString::number(hRte.iRunner) << "\n";
        str = "Количество локальных объектов iLocals: "; out << str << QString::number(hRte.iLocals) << "\n";
        str = "Поле индикаторов (wFlags): 0x"; out << str << QString::number(hRte.wFlags, 16).toUpper() << "\n";
        str = "Размер области кода dwProgram: "; out << str << QString::number(hRte.dwProgram) << "\n";
        str = "Размер таблицы функций iAAT: "; out << str << QString::number(hRte.iAAT) << "\n";
        str = "Количество реакций iRAT: "; out << str << QString::number(hRte.iRAT) << "\n";
        str = "Количество сообщений iMAT: "; out << str << QString::number(hRte.iMAT) << "\n";
        str = "\nЦИКЛ ВЫБОРКИ ИМЕН:\n"; out << str ;
        for(int i = 0; i < hRte.iRunner; i++) {
             out << RunStr[i] << "\n";
        }
        if(hRte.iRAT != 0) { // Таблица реакций и функций обработки данных
            str = "\nТаблица реакций  и функций обработки данных: "; out << str << QString::number(hRte.iRAT);
            RAT* prat = (RAT*) ArrayRat;
            for(int i = 0; i < hRte.iRAT; i++) {
                str = "\nРеакция N: "; out << str << QString::number(i+1) << "\n";
                str = "Идентификатор объекта iObject: "; out << str << QString::number(prat->iObject) << "\n";
                str = "Идентификатор окна iWindow: "; out << str << QString::number(prat->iWindow) << "\n";
                str = "Индекс режима iMode: "; out << str << QString::number(prat->iMode) << "\n";
                str = "Индекс функции обработки iHandler: "; out << str << QString::number(prat->iHandler) << "\n";
                str = "Поле индикаторов (Flags): 0x"; out << str << QString::number(prat->Flags, 16).toUpper() << "\n";
                prat++;
            }
        }
        if(hRte.iMAT != 0) { // Таблица сообщений и функций обработки данных
            MAT* pmat = (MAT*) ArrayMat;
            str = "\nТаблица сообщений  и функций обработки данных: "; out << str << QString::number(hRte.iMAT);
            for(int i = 0; i < hRte.iMAT; i++) {
                str = "\nСообщение N: "; out << str << QString::number(i+1) << "\n";
                str = "Индекс сообщения iMessage: "; out << str << QString::number(pmat->iMessage) << "\n";
                str = "Индекс режима iMode: "; out << str << QString::number(pmat->iMode) << "\n";
                str = "Индекс функции обработки iHandler: "; out << str << QString::number(pmat->iHandler) << "\n";
                str = "Поле индикаторов (Flags): 0x"; out << str << QString::number(pmat->Flags, 16).toUpper() << "\n";
                pmat++;
            }
        }
        if(hRte.iAAT != 0) { // Таблица операций
            AAT* pat = (AAT*) ArrayAat;
            str = "\nТаблица операций (функций): "; out << str << QString::number(hRte.iAAT);
            for(int i = 0; i < hRte.iAAT; i++) {
                str = "\nФункция N: "; out << str << QString::number(i+1) << "\n";
                str = "Идентификатор операции szAction[24: "; out << str << SetLine(pat->szAction) << "\n";
                str = "Индекс операции iIndex: "; out << str << QString::number(pat->iIndex) << "\n";
                str = "Адрес точки входа wAddress: "; out << str << QString::number(pat->wAddress) << "\n";
                str = "Количество аргументов iArgs: "; out << str << QString::number(pat->iArgs) << "\n";
                str = "Количество локальных символов iLocals: "; out << str << QString::number(pat->iLocals) << "\n";
                pat++;
            }
        }
     }
    file.close();
    return true;
}
